//
//  基础知识.swift
//  learnSwift
//
//  Created by chenXinzhi on 2025/4/26.
//

import Foundation

func 基础知识() {
    // 声明一个常量
    let a = 1
    // 声明一个变量
    var b = 1
    b = 2
    //声明一个常量在稍后赋值,只能赋值一次,必须在读取的时候赋值
    let c: Int
    c = 3

    var x = 1, y = 0.09, z = 3
    //非要使用关键字包起来就可以了
    var `if` = 1
    //字符串模板
    print("x的值是\(x)")

    //多行语句
    let cat = "🐶"; print(cat)
    //8位无符号的整型
    let minValue = UInt8.min
    //在32位系统上默认int32,在64位系统上默认int64
    let d: Int = 1
    let d1: UInt = 1
    //默认为64位
    let e: Double = 64
    //默认为32位
    let e1: Float = 32.0
    //这里的3将会推断位double类型
    let anotherPi = 3 + 0.14159
    //不同类型默认不能直接相加,不过应该可以通过自定义扩展是可以的
    let f = d + Int(d1)

    //类型别名
    typealias B = Int8

    let g = true
    if 1 == 1 {

    }
    //定义一个元祖,元祖可是是不同类型的
    let http404Error = (404, "Not Found")
    //解构元祖
    let (status, msg) = http404Error
    //使用下划线忽略值
    let (status1, _) = http404Error
    //可以访问元祖的元素
    print(http404Error.0)
    print(http404Error.1)
    //具名元祖
    var http404Error1 = (status: 200, msg: "Not Found")
    print(http404Error1.status)
    print(http404Error1.msg)
    //可空类型
    let f12 = Int(msg)
    let f13: String? = nil
    let f14: String? //自动设置为nil

    //可选绑定,f12开启一个新的作用域
    if let f12 {
        //当不为nil的时候会进来,并且这个新的f12新的变量的作用域只会在括号中,
        f12
    } else {
        //当为nil的时候进来
//        var x = ee
        print(f12)

    }//作用域失效

    //可选绑定,f12开启一个新的作用域
    if let f13 = f12 {
        //当不为nil的时候会进来,并且这个新的f12新的变量的作用域只会在括号中,
        f13
    } else {
        //当为nil的时候进来
//        var x = ee
        print(f13)

    }//作用域失效

    if var f12 {
        //也可以作为一个局部变量使用,可以修改
    }

    //多个判断,任意一个为nil或者false都不会进去
    if let f12, let f16 = Int("3"), 1 > 2, 1 > f12 && f12 > 2, f12 > f16 {

    }

    //提供备用值
    let aa: String? = "1"
    print(aa ?? "2")

    //强制解包
    let possibleNumber = "123"
    let convertedNumber = Int(possibleNumber)

    //这个是等效写法,实际上用!的时候不为空会解包里面的值,如果为空则抛出异常fatalError("The number was invalid")
    let number = convertedNumber!
    guard let number = convertedNumber else {
        fatalError("The number was invalid")
    }
    let possibleString: String? = "An optional string."
    let forcedString: String = possibleString! // 需要显式解包


    let assumedString: String! = "An implicitly unwrapped optional string."
    //显示的指定了类型以后尝试作为普通可选值发现为nil,于是强制拆包
    let implicitString: String = assumedString // 隐式解包
    // optionalString变成了String?
    //在使用隐式解包的可选值时，Swift 会首先尝试将其作为普通可选值使用；如果不能将其作为可选值使用，Swift 就会强制解包该值。
    //在没有定义类型的时候优先使用普通的可选值,
    let optionalString = assumedString

    if assumedString != nil {
        //在不显示指定类型的时候将他转化为不可空类型
        let ff = assumedString!
        print(ff)
    }
    //也可以跟可空类型一样使用该方式
    if let definiteString = assumedString {
        print(definiteString)
    }
    let age = -3
//    assert(age >= 0, "A person's age can't be less than zero.")
//    assert(age >= 0)
    //如果已经自行的检查的条件,那么可以手动的进行断言
    if age > 10 {
        print("You can ride the roller-coaster or the ferris wheel.")
    } else if age >= 0 {
        print("You can ride the ferris wheel.")
    } else {
        assertionFailure("A person's age can't be less than zero.")
    }



}

